home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 2 / Gekikoh Dennoh Club Vol. 2 (Japan).7z / Gekikoh Dennoh Club Vol. 2 (Japan) (Track 01).bin / tools / cd2pcmt / source.lzh / scsi_cmd.c < prev    next >
Text File  |  1997-10-01  |  4KB  |  186 lines

  1. #include <TNB.H>
  2. #include "extern.h"
  3.  
  4. /* SCSI コマンド実行処理 */
  5.  
  6. /*********************************************
  7.  
  8.     int scsi_cmd(
  9.         int id
  10.             SCSI-ID
  11.         int len
  12.             CDB の長さ
  13.         unsigned char *buf
  14.             CDB のアドレス
  15.         int rlen
  16.             データ読み込みの場合、バイト数
  17.             データ書き込みの場合、バイト数|0x80000000
  18.             0ならデータ読み込み無し
  19.         unsigned char *buf2
  20.             データアドレス
  21.  
  22. *********************************************/
  23. int scsi_cmd( int len, unsigned char *buf, int rlen, unsigned char *buf2 )
  24. {
  25.     int rc;
  26.     register int ID asm("d4");
  27.     ID=SCSI_ID;
  28.     /* セレクションフェーズ */
  29.     rc  = S_SELECT(ID);
  30.     if ( rc!=0 ) return(-1);;
  31.     /* コマンドフェース */
  32.     buf[1]=(buf[1]&0x1F)|(ID/0x10000*0x20);
  33.     rc = S_CMDOUT( len, buf );
  34.     if ( rc!=0 ) return(-1);;
  35.     if ( rlen != 0 ){
  36.         /* データインフェーズ */
  37.         if ( dma_fg==0 )            /* DMAC使用フラグ*/
  38.             rc = S_DATAIN_P( rlen, buf2 );
  39.         else    rc = S_DATAIN( rlen, buf2 );
  40.         if ( rc==-1 )
  41.             return(-1);
  42.         if ( mach2_fg==0 && rc==-2 ){
  43.             rc=scsi_cmd_sm();
  44.             if ( rc!=0 )
  45.                 return(rc);
  46.             return(-2);;
  47.         }
  48.     }
  49.     return( scsi_cmd_sm() );
  50. }
  51. /*+++++++++++++*/
  52. int scsi_cmd__( int len, unsigned char *buf, int rlen, unsigned char *buf2 )
  53. {
  54.     int rc;
  55.     register int ID asm("d4");
  56.     ID=SCSI_ID;
  57.     /* セレクションフェーズ */
  58.     rc  = S_SELECT(ID);
  59.     if ( rc!=0 ) return(-1);;
  60.     /* コマンドフェース */
  61.     buf[1]=(buf[1]&0x1F)|(ID/0x10000*0x20);
  62.     rc = S_CMDOUT( len, buf );
  63.     if ( rc!=0 ) return(-1);;
  64.     if ( rlen != 0 ){
  65.         /* データインフェーズ */
  66.         if ( dma_fg==0 ){            /* DMAC使用フラグ*/
  67.             if ( sct_fg!=0 ){
  68.                 rc = S_DATAIN_PI( rlen, buf2 );
  69.             } else if ( stm_fg==0 ){
  70.                 rc = S_DATAIN_P( rlen, buf2 );
  71.             } else {
  72.                 rc = S_DATAIN_M( rlen, buf2 );
  73.             }
  74.         } else {
  75.             rc = S_DATAIN( rlen, buf2 );
  76.         }
  77.         if ( rc==-1 )
  78.             return(-1);
  79.         if ( mach2_fg==0 && rc==-2 ){
  80.             rc=scsi_cmd_sm();
  81.             if ( rc!=0 )
  82.                 return(rc);
  83.             return(-2);;
  84.         }
  85.     }
  86.     return( scsi_cmd_sm() );
  87. }
  88. /*++++++++++++++*/
  89. int scsi_cmd_sm()
  90. {
  91.     unsigned char status,msg;
  92.     int    rc;
  93.     /* ステイタスフェーズ */
  94.     rc = S_STSIN( &status );
  95.     if ( rc!=0 ) return(-1);;
  96.     /* メッセージフェーズ */
  97.     rc = S_MSGIN( &msg );
  98.     if ( rc!=0 ) return(-1);
  99.     return( msg*0x10000 + status );
  100. }
  101.  
  102.  
  103. asm("
  104. _S_DATAIN_PI::
  105.     move.l    d3,-(sp)
  106.     move.l    4+4(sp),d3
  107.     move.l    4+8(sp),a1
  108.     move.l    #$13,d1            * S_DATAIN_PI
  109.     moveq    #$F5,d0
  110.     trap    #15
  111.     move.l    (sp)+,d3
  112.     rts
  113. _S_DATAIN_M::
  114.     move.l    d3,-(sp)
  115.     move.l    4+4(sp),d3
  116.     move.l    4+8(sp),a1
  117.     move.l    #$14,d1            * S_DATAIN_M
  118.     moveq    #$F5,d0
  119.     trap    #15
  120.     move.l    (sp)+,d3
  121.     rts
  122. _S_DATAIN_P::
  123.     move.l    d3,-(sp)
  124.     move.l    4+4(sp),d3
  125.     move.l    4+8(sp),a1
  126.     move.l    #$0B,d1            * S_DATAIN_P
  127.     moveq    #$F5,d0
  128.     trap    #15
  129.     move.l    (sp)+,d3
  130.     rts
  131. _S_DATAOUT_P::
  132.     move.l    d3,-(sp)
  133.     move.l    4+4(sp),d3
  134.     move.l    4+8(sp),a1
  135.     move.l    #$0C,d1            * S_DATAOUT_P
  136.     moveq    #$F5,d0
  137.     trap    #15
  138.     move.l    (sp)+,d3
  139.     rts
  140. _S_LEVEL_::
  141.     move.l    #$0A,d1
  142.     moveq    #$F5,d0
  143.     trap    #15
  144.     rts
  145. _S_MODESELECT::
  146.     movem.l    d3-d4,-(sp)
  147.     move.l    $000c(sp),d2
  148.     moveq    #$00,d3
  149.     move.w    $0012(sp),d3
  150.     move.l    $0014(sp),d4
  151.     movea.l    $0018(sp),a1
  152.     move.l    #$2A,d1            * MODESELECT
  153.     moveq    #$F5,d0
  154.     trap    #15
  155.     movem.l    (sp)+,d3-d4
  156.     rts
  157. _S_MODESENSE::
  158.     movem.l    d3-d4,-(sp)
  159.     move.l    $000c(sp),d2
  160.     moveq    #$00,d3
  161.     move.w    $0012(sp),d3
  162.     move.l    $0014(sp),d4
  163.     movea.l    $0018(sp),a1
  164.     move.l    #$29,d1            * MODESENSE
  165.     moveq    #$F5,d0
  166.     trap    #15
  167.     movem.l    (sp)+,d3-d4
  168.     rts
  169. _S_TW_CHK::
  170.     move.l    #$1E,d1
  171.     moveq    #$F5,d0
  172.     trap    #15
  173.     rts
  174.  
  175. _S_TW_LEVEL::
  176.     move.l    d4,-(sp)
  177.     move.l    4+4(sp),d4
  178.     move.l    #$20A,d1
  179.     moveq    #$F5,d0
  180.     trap    #15
  181.     move.l    (sp)+,d4
  182.     rts
  183.  
  184.  
  185. ");
  186.